// 给定两个字符串形式的非负整数 num1 和num2 ，计算它们的和。
// 要求不能使用任何內建 BigInteger 库， 也不能直接将输入的字符串转换为整数形式。
// num1 和num2 都不包含任何前导零。

function addStrings(num1: string, num2: string): string {
  let pointer1: number = num1.length - 1; // 指针1
  let pointer2: number = num2.length - 1; // 指针2
  let currNum1: number = 0; // 当前数1
  let currNum2: number = 0; // 当前数2
  let carry: number = 0; // 初始进位
  let res: string = "";// 结果变量
  while (pointer1 >= 0 || pointer2 >= 0) {
    // 判断指针是否出现越界
    currNum1 = pointer1 < 0 ? 0 : parseInt(num1[pointer1]);
    currNum2 = pointer2 < 0 ? 0 : parseInt(num2[pointer2]);
    let currSum = currNum1 + currNum2 + carry;// 当前进位和
    let realNum = currSum % 10;// 真实位数
    carry = Math.floor(currSum / 10); /*计算进位*/
    res = realNum + res;
    pointer1--;
    pointer2--;
  }
  return carry > 0 ? "1" + res : res;
}

// 这道题目要求不能直接将字符串转换为整数，但是是可以将单个位数转换为整数的
// 所以在求解的过程中主要采取的是双指针算法来来模拟竖式运算
// 大循环的出口设定为当两个指针的索引都小于0
// 1、首先设定两个指针，分别指向给定两字符串的尾部
// 2、判断指针是否越界，当指针越界时，将当前位数的数直接赋值为0
// 3、接下来计算当前的数位和（需要加上进位来求和），通过数位和与10来进行板除运算即可求得是否进位
// 4、计算真实的数位和，通过真实的数位和来与10做求余运算即可得到真实的数位和
// 反复进行上述操作直到退出循环，最后不要忘记返回结果的同时也要判断是否存在进位
// 若存在进位则仍需要再拼接一位。
